package hu.vpszd.services.impl

import hu.vpszd.Config;
import hu.vpszd.entities.BankContact
import hu.vpszd.entities.customer.Customer
import hu.vpszd.entities.transaction.Income
import hu.vpszd.entities.transaction.LoanApplication
import hu.vpszd.services.ContractService

import java.awt.Desktop
import java.text.SimpleDateFormat

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional

import com.itextpdf.text.BaseColor
import com.itextpdf.text.Document
import com.itextpdf.text.Element
import com.itextpdf.text.Font
import com.itextpdf.text.PageSize
import com.itextpdf.text.Phrase
import com.itextpdf.text.Font.FontFamily
import com.itextpdf.text.pdf.PdfContentByte
import com.itextpdf.text.pdf.PdfPCell
import com.itextpdf.text.pdf.PdfPTable
import com.itextpdf.text.pdf.PdfWriter


@Service
@Transactional
public class ContractServiceImpl implements ContractService {

	Document document
	def today
	SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd-HHmmss");
	final static Integer SPACE_AFTER_TABLE = 15
	final static Integer SPACE_AFTER_TITLE = 5
	
	@Autowired
	private Config config;

	void createContract(LoanApplication loanApplication, Customer customer){

		PdfPTable table = new PdfPTable(1)
		PdfPCell cell = new PdfPCell()

		document = new Document(PageSize.A4)
		println("Document Created")

		today = new Date()
		//		PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("D:\\Dropbox\\workspace\\zContracts\\Contract "+ dateFormat.format(today) +".pdf"));
//		PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("G:\\Dropbox\\workspace\\zContracts\\Contract "+ dateFormat.format(today) +".pdf"));
		PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(config.getPrintRoot() + "\\Contract_"+ dateFormat.format(today) +".pdf"));
		println("PdfWriter Created")

		document.open()
		println("Document Opened")

		printHeader(today, writer);

		PdfPTable contractTitle = new PdfPTable(1)
		cell = new PdfPCell(new Phrase("Szerzödés"))
		cell.setHorizontalAlignment(Element.ALIGN_CENTER)
		contractTitle.addCell(cell)
		contractTitle.setSpacingAfter(SPACE_AFTER_TITLE);
		document.add(contractTitle)

		table = new PdfPTable(1);
		cell = new PdfPCell(new Phrase("Tisztelt Ügyfelünk! \n\nKöszönjük érdeklödését a Varga Bank Zrt. Bank Személyi kölcsön termékünk iránt. \nAz Ön által megadott információk alapján termékünket az alábbi kondíciókkal és feltételekkel ajánljuk."));
		table.addCell(cell);
		table.setSpacingAfter(SPACE_AFTER_TABLE);
		document.add(table)

		table = new PdfPTable(1);
		cell = new PdfPCell(new Phrase("Ügylet azonosító"));
		cell.setHorizontalAlignment(Element.ALIGN_CENTER)
		table.addCell(cell);
		cell = new PdfPCell(new Phrase(loanApplication.id + ""));
		cell.setColspan(2);
		cell.setHorizontalAlignment(Element.ALIGN_CENTER)
		table.addCell(cell);
		table.setSpacingAfter(SPACE_AFTER_TABLE);
		document.add(table)

		PdfPTable bankContactDataTitle = new PdfPTable(1)
		cell = new PdfPCell(new Phrase("Elérhetöségi adatok"));
		cell.setHorizontalAlignment(Element.ALIGN_CENTER)
		bankContactDataTitle.addCell(cell)
		bankContactDataTitle.setSpacingAfter(SPACE_AFTER_TITLE);
		document.add(bankContactDataTitle)

		PdfPTable bankContactDataTable = bankContactData(loanApplication)
		document.add(bankContactDataTable)

		PdfPTable loanDataTitle = new PdfPTable(1)
		cell = new PdfPCell(new Phrase("Hitel adatok"));
		cell.setHorizontalAlignment(Element.ALIGN_CENTER)
		loanDataTitle.addCell(cell)
		loanDataTitle.setSpacingAfter(SPACE_AFTER_TITLE);
		document.add(loanDataTitle)

		PdfPTable loanDataTable = loanData(loanApplication, customer)
		document.add(loanDataTable)

		PdfPTable customerDataHeader = new PdfPTable(1)
		cell = new PdfPCell(new Phrase("Ügyfél adatok"));
		cell.setHorizontalAlignment(Element.ALIGN_CENTER)
		customerDataHeader.addCell(cell)
		customerDataHeader.setSpacingAfter(SPACE_AFTER_TITLE);
		document.add(customerDataHeader)

		PdfPTable customerDataTable = customerData(loanApplication, customer)
		document.add(customerDataTable)

		PdfPTable incomeDataHeader = new PdfPTable(1)
		cell = new PdfPCell(new Phrase("Jövedelem adatok"));
		cell.setHorizontalAlignment(Element.ALIGN_CENTER)
		incomeDataHeader.addCell(cell)
		incomeDataHeader.setSpacingAfter(SPACE_AFTER_TITLE);
		document.add(incomeDataHeader)

		PdfPTable incomeDataTable = incomeData(loanApplication, customer)
		document.add(incomeDataTable)

		PdfPTable bankRelationshipDataHeader = new PdfPTable(1)
		cell = new PdfPCell(new Phrase("Bankkapcsolati adatok"));
		cell.setHorizontalAlignment(Element.ALIGN_CENTER)
		bankRelationshipDataHeader.addCell(cell)
		bankRelationshipDataHeader.setSpacingAfter(SPACE_AFTER_TITLE);
		document.add(bankRelationshipDataHeader)

		PdfPTable bankRelationshipDataTable = bankRelationshipData(loanApplication, customer)
		document.add(bankRelationshipDataTable)

		document.newPage()

		PdfPTable loanRelatedDocumentsTitle = new PdfPTable(1)
		cell = new PdfPCell(new Phrase("Igényléshez szükséges dokumentumok"))
		cell.setHorizontalAlignment(Element.ALIGN_CENTER)
		loanRelatedDocumentsTitle.addCell(cell)
		loanRelatedDocumentsTitle.setSpacingAfter(SPACE_AFTER_TITLE);
		document.add(loanRelatedDocumentsTitle)

		table = new PdfPTable(1);
		cell = new PdfPCell(new Phrase("Tisztelt Ügyfelünk! \n\nKérjük, hogy az szerzödéskötéshez az alábbi dokumentumokat szíveskedjen magával hozni: \n- Érvényes személyi igazolvány (ennek hiányában új kártyaformátumú vezetöi engedély, vagy útlevél) valamint lakcímkártya. \n- Adóigazolvány. \n- 30 napnál nem régebbi Munkáltatói igazolás. Megjegyzés: Egyedi hitelbírálattól függöen a bank az alkalmazottaktól és a nyugdíjasoktól is kérhet NAV jövedelemigazolást. \n- Határozott idejű munkaviszony esetén szándéknyilatkozat a munkáltatótól a munkaviszony meghosszabbítására vonatkozóan. Ha a határozott munkaviszony kevesebb, mint 6 hónapra szól, akkor az elfogadáshoz szükséges a munkáltató szándéknyilatkozata a munkáltatótól a szerzödés meghosszabbítására vonatkozóan. \n- Utolsó kéthavi bankszámla kivonat arról a lakossági bankszámláról, amelyre a havi jövedelme érkezik. (Egyéni vállalkozók esetén, amennyiben nem rendelkezik lakossági bankszámlával, az egyéni vállalkozói bankszámlakivonatot is elfogadjuk.) Ha a Raiffeisen Bankhoz érkezik az ügyfél teljes jövedelme, akkor nem szükséges benyújtani 2 havi bankszámla kivonatot. Ha nem a teljes jövedelem érkezik a Raiffeisen Bankhoz, akkor arról a számláról szükséges a 2 havi bankszámlakivonat, ahová a jövedelem másik része érkezik. \n- Saját névre, vagy bejelentett lakcímre szóló vezetékes telefon vagy elöfizetéses mobiltelefon esetén utolsó havi telefonszámla. Ezek hiányában a bejelentett lakcímére szóló 2 darab, különbözö típusú, utolsó havi közüzemi (víz, villany, gáz, távhö, internet) számla."));
		table.addCell(cell);
		table.setSpacingAfter(SPACE_AFTER_TABLE);
		document.add(table)

		table = new PdfPTable(3);
		cell = new PdfPCell(new Phrase("Keltezés"));
		table.addCell(cell);
		cell = new PdfPCell(new Phrase(""));
		cell.setColspan(2);
		table.setSpacingAfter(SPACE_AFTER_TABLE);
		table.addCell(cell);
		cell = new PdfPCell(new Phrase("Ügyfél aláírása"));
		table.addCell(cell);
		cell = new PdfPCell(new Phrase(""));
		cell.setColspan(2);
		table.setSpacingAfter(SPACE_AFTER_TABLE);
		table.addCell(cell);
		document.add(table)

		printFooter(today, writer)
		document.newPage()

		document.close()
		println("Document Closed")
		
		String pdfFile=config.getPrintRoot() + "\\Contract_"+ dateFormat.format(today) +".pdf";
		if (pdfFile.toString().endsWith(".pdf")) {
			Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + pdfFile);
		} else {
			Desktop desktop = Desktop.getDesktop();
			desktop.open(pdfFile);
		}
	}

	public static PdfPTable loanData(LoanApplication loanApplication, Customer customer) {
		PdfPTable table = new PdfPTable(3);
		PdfPCell cell;

		println(loanApplication.loanAmountByBank + loanApplication.durationByBank + loanApplication.installment + loanApplication.interest)

		cell = new PdfPCell(new Phrase("Hitelösszeg"));
		table.addCell(cell);
		cell = new PdfPCell(new Phrase(loanApplication.loanAmountByBank + " Forint"));
		cell.setColspan(2);
		table.addCell(cell);

		cell = new PdfPCell(new Phrase("Futamidö"));
		table.addCell(cell);
		cell = new PdfPCell(new Phrase(loanApplication.durationByBank + " hónap"));
		cell.setColspan(2);
		table.addCell(cell);

		cell = new PdfPCell(new Phrase("Havi törlesztörészlet"));
		table.addCell(cell);
		cell = new PdfPCell(new Phrase(loanApplication.installment + " Forint"));
		cell.setColspan(2);
		table.addCell(cell);

		cell = new PdfPCell(new Phrase("Kamat"));
		table.addCell(cell);
		String strInterest = loanApplication.interest
		cell = new PdfPCell(new Phrase(loanApplication.interest + " %"));
		cell.setColspan(2);
		table.addCell(cell);

		table.setSpacingAfter(SPACE_AFTER_TABLE);
		return table
	}

	public static PdfPTable customerData(LoanApplication loanApplication, Customer customer) {
		PdfPTable table = new PdfPTable(3);
		PdfPCell cell;

		cell = new PdfPCell(new Phrase("Név"));
		table.addCell(cell);
		cell = new PdfPCell(new Phrase(customer.lastName + " " + customer.firstName));
		cell.setColspan(2);
		table.addCell(cell);

		cell = new PdfPCell(new Phrase("Születési ország, hely"));
		table.addCell(cell);
		cell = new PdfPCell(new Phrase(customer.birthCountry + ", " + customer.birthplace));
		cell.setColspan(2);
		table.addCell(cell);

		cell = new PdfPCell(new Phrase("Lakcímkártya"));
		table.addCell(cell);
		cell = new PdfPCell(new Phrase(customer.addressCard.ACidentityNumber));
		cell.setColspan(2);
		table.addCell(cell);

		cell = new PdfPCell(new Phrase("Személyi igazolvány"));
		table.addCell(cell);
		cell = new PdfPCell(new Phrase(customer.idCard.ICidentityNumber));
		cell.setColspan(2);
		table.addCell(cell);

		cell = new PdfPCell(new Phrase("Adókártya"));
		table.addCell(cell);
		cell = new PdfPCell(new Phrase(customer.taxCard.TCidentityNumber));
		cell.setColspan(2);
		table.addCell(cell);

		cell = new PdfPCell(new Phrase("Képzettség"));
		table.addCell(cell);
		cell = new PdfPCell(new Phrase(loanApplication.education));
		cell.setColspan(2);
		table.addCell(cell);

		cell = new PdfPCell(new Phrase("Családi állapot"));
		table.addCell(cell);
		cell = new PdfPCell(new Phrase(loanApplication.maritalStatus));
		cell.setColspan(2);
		table.addCell(cell);

		cell = new PdfPCell(new Phrase("Bejelentett lakcím"));
		table.addCell(cell);
		cell = new PdfPCell(new Phrase(loanApplication.address.zipCode + " " + loanApplication.address.country + ", " + loanApplication.address.state + " megye, " + loanApplication.address.city + ", " + loanApplication.address.streetName + ", " + loanApplication.address.houseNumber));
		cell.setColspan(2);
		table.addCell(cell);

		cell = new PdfPCell(new Phrase("Állandó lakhelyén"));
		table.addCell(cell);
		cell = new PdfPCell(new Phrase(loanApplication.residency));
		cell.setColspan(2);
		table.addCell(cell);

		cell = new PdfPCell(new Phrase("Email"));
		table.addCell(cell);
		cell = new PdfPCell(new Phrase(loanApplication.emailAddress));
		cell.setColspan(2);
		table.addCell(cell);

		cell = new PdfPCell(new Phrase("Mobiltelefon"));
		table.addCell(cell);
		cell = new PdfPCell(new Phrase(loanApplication.mobilePhone));
		cell.setColspan(2);
		table.addCell(cell);

		cell = new PdfPCell(new Phrase("Vezetékes telelfon"));
		table.addCell(cell);
		cell = new PdfPCell(new Phrase(loanApplication.wiredPhone));
		cell.setColspan(2);
		table.addCell(cell);

		cell = new PdfPCell(new Phrase("Egyéb telefon"));
		table.addCell(cell);
		cell = new PdfPCell(new Phrase(loanApplication.otherPhone));
		cell.setColspan(2);
		table.addCell(cell);

		table.setSpacingAfter(SPACE_AFTER_TABLE);
		return table;
	}

	public static PdfPTable incomeData(LoanApplication loanApplication, Customer customer){
		PdfPTable table = new PdfPTable(2);
		PdfPCell cell;
		List<Income> incomes = []

		for (i in loanApplication.incomes) {
			cell = new PdfPCell(new Phrase("Jövedelem, beosztás"));
			table.addCell(cell);
			String incomeTypeAndRank = i.incomeType + ", " + i.rank
			cell = new PdfPCell(new Phrase(incomeTypeAndRank));
			cell.setColspan(2);
			table.addCell(cell);

			cell = new PdfPCell(new Phrase("Munkáltató neve, címe"));
			table.addCell(cell);
			String companyNameAndCompanyAddress = i.companyName + ", " + i.companyAddress
			cell = new PdfPCell(new Phrase(companyNameAndCompanyAddress));
			cell.setColspan(2);
			table.addCell(cell);

			//			cell = new PdfPCell(new Phrase("Kölcsön lejárata"));
			//			table.addCell(cell);
			//
			//			SimpleDateFormat loanExpirationSDF = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
			//			//		String strLoanExpiration = loanExpirationSDF.format(loanExpiration);
			//
			//			String loanExpiration = loanExpirationSDF.format(e.loanExpiration);
			//			cell = new PdfPCell(new Phrase(loanExpiration));
			//			cell.setColspan(2);
			//			table.addCell(cell);

			cell = new PdfPCell(new Phrase("Munkaviszony kezdete"));
			table.addCell(cell);
			SimpleDateFormat lengthOfEmployementSDF = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
			String lengthOfEmployement = lengthOfEmployementSDF.format(i.lengthOfEmployement)
			cell = new PdfPCell(new Phrase(lengthOfEmployement));
			cell.setColspan(2);
			table.addCell(cell);

			cell = new PdfPCell(new Phrase("Cégejegyzékszám"));
			table.addCell(cell);
			String registrationNumber = i.registrationNumber + ""
			cell = new PdfPCell(new Phrase(registrationNumber));
			cell.setColspan(2);
			table.addCell(cell);

			cell = new PdfPCell(new Phrase("Adószám"));
			table.addCell(cell);
			String taxNumber = i.taxNumber + ""
			cell = new PdfPCell(new Phrase(taxNumber));
			cell.setColspan(2);
			table.addCell(cell);
		}
		table.setSpacingAfter(SPACE_AFTER_TABLE);
		return table
	}


	public static PdfPTable bankRelationshipData(LoanApplication loanApplication, Customer customer) {
		PdfPTable table = new PdfPTable(2);
		PdfPCell cell;

		cell = new PdfPCell(new Phrase("Bankszámla száma"));
		table.addCell(cell);
		String bankAccountNumber = loanApplication.bankAccountNumber
		cell = new PdfPCell(new Phrase(bankAccountNumber));
		cell.setColspan(2);
		table.addCell(cell);


		for (e in loanApplication.existingLoanDebts) {
			cell = new PdfPCell(new Phrase("Fennálló kölcsöntartozás összege"));
			table.addCell(cell);
			String existingLoanDebtAmount = e.existingLoanDebtAmount
			cell = new PdfPCell(new Phrase(existingLoanDebtAmount));
			cell.setColspan(2);
			table.addCell(cell);

			cell = new PdfPCell(new Phrase("Fennálló kölcsöntartozás devizaneme"));
			table.addCell(cell);
			String currency = e.currency + ""
			cell = new PdfPCell(new Phrase(currency));
			cell.setColspan(2);
			table.addCell(cell);

			cell = new PdfPCell(new Phrase("Havi törlesztö"));
			table.addCell(cell);
			String monthlyInstallment = e.monthlyInstallment
			cell = new PdfPCell(new Phrase(monthlyInstallment));
			cell.setColspan(2);
			table.addCell(cell);

			cell = new PdfPCell(new Phrase("Kölcsön lejárata"));
			table.addCell(cell);

			SimpleDateFormat loanExpirationSDF = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
			//		String strLoanExpiration = loanExpirationSDF.format(loanExpiration);

			String loanExpiration = loanExpirationSDF.format(e.loanExpiration);
			cell = new PdfPCell(new Phrase(loanExpiration));
			cell.setColspan(2);
			table.addCell(cell);
		}

		table.setSpacingAfter(SPACE_AFTER_TABLE);
		return table
	}

	public static PdfPTable bankContactData(LoanApplication loanApplication){
		PdfPTable table = new PdfPTable(2);
		PdfPCell cell;

		cell = new PdfPCell(new Phrase("Telefonszám"));
		table.addCell(cell);
		String phoneNumber = BankContact.PHONE_NUMBER
		cell = new PdfPCell(new Phrase(phoneNumber));
		cell.setColspan(2);
		table.addCell(cell);

		cell = new PdfPCell(new Phrase("Email cím"));
		table.addCell(cell);
		String email = BankContact.EMAIL
		cell = new PdfPCell(new Phrase(email));
		cell.setColspan(2);
		table.addCell(cell);
		
		cell = new PdfPCell(new Phrase("Ügyintéző azonosítója, neve"));
		table.addCell(cell);
		String user = loanApplication.user.id + ", " + loanApplication.user.userName
		cell = new PdfPCell(new Phrase(user));
		cell.setColspan(2);
		table.addCell(cell);

		table.setSpacingAfter(SPACE_AFTER_TABLE);
		return table
	}

	public static void printHeader(Date today, PdfWriter writer){
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd.");
		PdfPTable header = new PdfPTable(3);
		header.setWidthPercentage(100);
		header.getDefaultCell().setBackgroundColor(BaseColor.BLACK);
		Font font = new Font(FontFamily.HELVETICA, 12, Font.BOLD, BaseColor.WHITE);

		Phrase p = new Phrase("Varga Bank Zrt.", font);
		header.addCell(p);

		p = new Phrase("", font);
		header.addCell(p);

		p = new Phrase(""+dateFormat.format(today)+"", font);
		header.addCell(p);

		PdfContentByte canvas = writer.getDirectContent();
		header.setTotalWidth(595)
		header.writeSelectedRows(0, 1, 0,842, canvas)
	}

	public static void printFooter(Date today, PdfWriter writer){
		PdfPTable footer = new PdfPTable(1);
		footer.setWidthPercentage(100);
		footer.getDefaultCell().setBackgroundColor(BaseColor.BLACK);
		footer.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);
		Font font = new Font(FontFamily.HELVETICA, 12, Font.BOLD, BaseColor.WHITE);
		Phrase p = new Phrase(writer.getPageNumber().toString(), font);
		footer.addCell(p);
		PdfContentByte canvas = writer.getDirectContent();
		footer.setTotalWidth(595)
		footer.writeSelectedRows(0, 1, 0, 16, canvas)
	}
}
